package com.operator.Activitys.activity;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.adapter.AddSupplyAdapter;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.bean.SupplyType;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.http.manager.HomeManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.operator.Activitys.utils.UiUtil;
import com.zhy.autolayout.AutoLinearLayout;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;
import me.nereo.multi_image_selector.MultiImageSelector;
import me.nereo.multi_image_selector.MultiImageSelectorActivity;

/**
 * 项目名称：金泽云 手机app
 * 类描述：添加 通讯供求页面
 * 创建人：张飞祥
 * 创建时间：2018/5/24 16:25
 * 修改人：张飞祥
 * 修改时间：2018/5/24 16:25
 * 修改备注：
 */
public class AddSupplyActivity extends BaseActivity {

    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //图片添加列表
    @Bind(R.id.gv_add_supply_list)
    GridView gvAddSupplyList;
    //内容
    @Bind(R.id.et_add_supply_content)
    EditText etAddSupplyContent;
    //下拉选择 供求类别
    @Bind(R.id.spinner_type_select)
    MaterialSpinner spinnerTypeSelect;
    //添加总布局
    @Bind(R.id.layout_add_supply)
    AutoLinearLayout layoutAddSupply;

    //图片数据源
    private List<String> mPicList = new ArrayList<>();
    //上传的图片的数据源
    private List<String> mHttpImgList = new ArrayList<>();
    //加载图片 adapter
    AddSupplyAdapter mAdapter = null;

    //初始化网络请求
    public HomeManager mApiManager;

    //TODO 当前用户信息
    private User mACacheUser = null;

    //通讯供求 type 集合
    private List<String> mSupplyTitle = null;
    //设置 供求类别 id
    private String mSupplyTagId = "";
    //供求type 加载一次 flag
    private boolean mOneFlag = true;

    //提示弹窗
    private MaterialDialog mMsgDialog;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_add_supply);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getHomeApiManager(this, this.getTaskId());

        //TODO 获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);

        //设置状态栏为透明
        setThemeTransparent();
        //标题
        tvTitle.setText("添加供求");
        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //初始化 分类 集合
        mSupplyTitle = new ArrayList<>();
    }

    @Override
    protected void initData() {
        //初始化RecyclerView
        initGridRecyclerView();
        //TODO 获取 通讯供求 type
        mApiManager.homeSupplyType();
    }

    /**
     * 初始化 网格 RecyclerView
     */
    private void initGridRecyclerView() {
        //实例化 adapter
        mAdapter = new AddSupplyAdapter(this, mPicList);
        //设置 适配器 到控件上
        gvAddSupplyList.setAdapter(mAdapter);

        /**
         * 设置 图片点击事件
         */
        gvAddSupplyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                if (position == parent.getChildCount() - 1) {
                    //如果“增加按钮形状的”图片的位置是最后一张，且添加了的图片的数量不超过6张，才能点击
                    if (mPicList.size() == Constant.MAX_SELECT_PIC_NUM) {
                        //最多添加6张图片
                        viewPluImg(position);
                    } else {
                        //添加凭证图片
                        selectPicture(Constant.MAX_SELECT_PIC_NUM - mPicList.size());
                    }
                } else {
                    viewPluImg(position);
                }
            }
        });

    }


    /**
     * 选择自定义图片
     */
    private void selectPicture(int count) {
        /**
         *
         *  特此注意：由于Android 6.0 的权限是一套新的授权机制，所以在用法上也格外的不同。
         *  在此 MultiImageSelector（仿微信图片浏览）框架 会显示 “无权限”
         *  在此要对机型动态的获取文件读写权限
         *
         */
        String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        int permission = ActivityCompat.checkSelfPermission(AddSupplyActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(AddSupplyActivity.this, PERMISSIONS_STORAGE, Constant.REQUEST_EXTERNAL_STORAGE);
        }
        //调用 MultiImageSelector 图片预览功能

        MultiImageSelector.create(this)
                .showCamera(false)
                .count(count)
                .multi() // 多选模式, 默认模式;
                .start(AddSupplyActivity.this, Constant.REQUEST_IMAGE);
    }

    /**
     * 查看图片缩略图
     *
     * @param position
     */
    private void viewPluImg(int position) {
        Bundle bundle = new Bundle();
        //TODO 传递 当前图片 数据
        //设置 是否可以删除 tag
        bundle.putBoolean(Constant.INTENT_IMAGE_DELETE_TAG, true);
        //设置 图片标志位
        bundle.putInt(Constant.INTENT_IMAGE_POS, position);
        //设置 图片加载方式 （本地图片）
        bundle.putString(Constant.INTENT_IMAGE_LOAD_TAG, Constant.IMAGE_LOAD_LOCAL);
        //设置 图片路径
        bundle.putStringArrayList(Constant.INTENT_IMAGE_URL_LIST, (ArrayList<String>) mPicList);
        //跳转 查看图片页面
        JumperUtils.JumpTo(this, ViewPictureActivity.class, bundle);
    }


    /**
     * 按钮点击事件
     *
     * @return
     */
    @OnClick({R.id.iv_return, R.id.btn_add_supply_submit})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.iv_return:            //返回按钮
                finish();
                break;

            case R.id.btn_add_supply_submit://提交供求
                initHttp();
                break;
        }
    }

    /**
     * 开始网络请求
     */
    private void initHttp() {
        //获取 添加 供求内容
        String content = etAddSupplyContent.getText().toString();
        //获取即将提交的 图片路径
        mHttpImgList = mAdapter.getHttpUrls();

        /**
         * 业务逻辑判断
         * 1.供求内容不能为空
         * 2.至少上传一张图片
         */
        if ("".equals(content)) {
            ToastUtils.showShort(AddSupplyActivity.this, "请填写供求内容！");
        } else if (mPicList.size() == 0) {
            ToastUtils.showShort(AddSupplyActivity.this, "请填上传供求图片！");
        } else {
            //弹出提示框
            initShowTimeDialog("正在提交，请稍候....", AddSupplyActivity.this);
            //开始网络请求
            mApiManager.homeAddSupply(mSupplyTagId, content, mACacheUser.getId(), mHttpImgList.get(0),
                    mHttpImgList.get(1), mHttpImgList.get(2), mHttpImgList.get(3), mHttpImgList.get(4), mHttpImgList.get(5));
        }

    }

    /**
     * 通讯供求type 列表
     * <p>
     * ps：这块 eventBus 带有粘性事件，出现了一个BUG,以后有时间再改
     * <p>
     * bug 描述：网络请求获取 供求分类列表 时，只发送了一次 EventBus 消息，
     * 但这个 方法 却接收到了两次，现因业务模块赶时间，所以先用 flag 判断一下，
     * 以后去做整改！
     */
    @Subscriber(tag = Constant.BUS_HOME_SUPPLY_TYPE, mode = ThreadMode.MAIN)
    public void initSupplyType(final List<SupplyType> list) {

        if (mOneFlag) {
            mOneFlag = false;
            if (list != null && list.size() != 0) {

                //TODO 循环添加 type
                for (int i = 0; i < list.size(); i++) {
                    mSupplyTitle.add(list.get(i).getTitle());
                }
                //TODO 填充数据 到下拉列表中
                spinnerTypeSelect.setItems(mSupplyTitle);
                //设置 下拉列表最大高度
                if (mSupplyTitle.size()>0)
                    spinnerTypeSelect.setDropdownMaxHeight(500);

                //设置默认选中的 type id
                mSupplyTagId = list.get(0).getId();

                //TODO 列表点击事件
                //监听事件
                spinnerTypeSelect.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
                    @Override
                    public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                        //设置选中的 type id
                        mSupplyTagId = list.get(position).getId();
                    }
                });
            }
        }
    }

    /**
     * 重新设置 总布局高度
     */
    private void setLayoutViewHeight(boolean flag){

        //TODO 获取当前 网格视图 高度
        //measure方法的参数值都设为0即可
        gvAddSupplyList.measure(0,0);

        //动态设置 gradView 高度
        int gvHeight = 0;

        if (flag)
            //获取组件高度
            gvHeight = UiUtil.dip2px(this, gvAddSupplyList.getMeasuredHeight()) * 2 + 450;
        else
            //获取组件高度
            gvHeight = UiUtil.dip2px(this, gvAddSupplyList.getMeasuredHeight()) + 300;

        //TODO 获取当前 总布局的 高度
        //measure方法的参数值都设为0即可
        layoutAddSupply.measure(0,0);
        //获取组件高度
        int layoutHeight = layoutAddSupply.getMeasuredHeight() + gvHeight;

        //TODO  设置总布局 高度
        LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) layoutAddSupply.getLayoutParams();
        //获取当前控件的布局对象
        params.height = layoutHeight;      //设置当前控件布局的高度
        layoutAddSupply.setLayoutParams(params);//将设置好的布局参数应用到控件中
    }

    /**
     * 添加 通讯供求 报错
     */
    @Subscriber(tag = Constant.BUS_HOME_ADD_SUPPLY_ERROR, mode = ThreadMode.MAIN)
    public void initAddSupplyError(String httpAddSupplyError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏加载
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(AddSupplyActivity.this, "添加失败，网络连接不稳定！");
            }
        }, 1000);
    }

    /**
     * 添加 通讯供求 返回数据
     */
    @Subscriber(tag = Constant.BUS_HOME_ADD_SUPPLY, mode = ThreadMode.MAIN)
    public void initAddSupply(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏加载
                timeDialog.dismiss();
                //TODO 业务逻辑判断
                if ("1".equals(state.getState())) {
                    //提示 dialog
                    mMsgDialog = new MaterialDialog.Builder(AddSupplyActivity.this)
                            .title("添加成功")
                            .content(state.getMsg())
                            .positiveText("嗯，我知道了")
                            .onPositive(new MaterialDialog.SingleButtonCallback() {
                                @Override
                                public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                    //销毁当前页面
                                    finish();
                                }
                            }).show();
                    // 设置点击屏幕Dialog不消失
                    mMsgDialog.setCanceledOnTouchOutside(false);
                    //取消Back键监听
                    mMsgDialog.setCancelable(false);
                } else {
                    //弹出提示
                    ToastUtils.showShort(AddSupplyActivity.this, state.getMsg());
                }
            }
        }, 1000);
    }

    /**
     * 加载 删除 列表中某一个 图片
     */
    @Subscriber(tag = Constant.BUS_DELETE_ITEM_IMG)
    public void onDeleteItemImg(int position) {
        //删除某一个图片
        mAdapter.setDeleteItemImg(position);

        if (mAdapter.getImgList().size()>3)
            //重新设置 总布局高度
            setLayoutViewHeight(true);
        else
            //重新设置 总布局高度
            setLayoutViewHeight(false);
    }


    /**
     * 图片 选择 图片 回调 方法
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //TODO 选择图片
        if (requestCode == Constant.REQUEST_IMAGE && resultCode == RESULT_OK) {

            //TODO 获取当前图片路径 转成 URi的形式
            List<String> images = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
            mPicList.addAll(images);
            // 图片选择结果回调
            mAdapter.notifyDataSetChanged();

            if (mAdapter.getImgList().size()>2)
                //重新设置 总布局高度
                setLayoutViewHeight(true);
            else
                //重新设置 总布局高度
                setLayoutViewHeight(false);
        }
    }
}
